﻿using System;
using System.IO;
using System.Linq;

namespace SolidQ.BCP
{
    public class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static int Main(string[] args)
        {

            int retorno = -1;
                        
            /// 1 argumento para pedir ejecutar acciones o para ver el modo de utilización
            /// 0 argumentos para ejecutar acciones en base al xml que se encuentra en la misma subcarpeta
            if (args.Length == 1)
            {
                if (!args[0].Equals("-?"))
                    retorno = Ejecutar(args[0]);
                else
                {
                    retorno = 1;
                    ShowExecutionExamples();
                }
            }

            else if (args.Length == 0)
                retorno = Ejecutar(null);
            else
            {
                Console.Error.WriteLine("Error on parameters: SolidQ.BCP.exe -?");
                ShowExecutionExamples();
            }

            return (retorno);

        }

        public static void ShowExecutionExamples()
        {
            Console.Out.WriteLine("Execution as: SolidQ.BCP.exe [  File.xml ");
            Console.Out.WriteLine("                                | -?");
            Console.Out.WriteLine("                              ]");
        }

        /// <summary>
        /// Ejecuta acciones, es decir, realiza lo que se le indica en el .xml
        /// Comportamiento anterior a las modificaciones realizadas por enrique catala
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        static int Ejecutar(string file)
        {

            if (String.IsNullOrEmpty(file))
                file = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "SolidQBCPConfig.xml");

            try
            {
                int retorno = 0;
                XmlDriver config = new XmlDriver();
                config.LoadFromXmlFile(file);

                SolidQBCPLibrary.SolidQBCPLibrary bcp = new SolidQBCPLibrary.SolidQBCPLibrary(config.BatchSize, config.NotifyAfter, config.HintStrings);
                //bcp.ForceColumnMapping = config.ForceColumnMapping; ahora va a nivel de dataflow
                bcp.AutomaticCollationResolution = config.AutomaticCollationResolution;


                foreach (SolidQBCPLibrary.BCPDataFlow df in config.dataFlows.OrderBy(x => x.IdPriority))
                {
                    bool _errorOcurred = bcp.CopyTable(df);

                    if (_errorOcurred)
                    {
                        retorno = -1;
                    }
                }

                return retorno;
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("Error: " + ex.GetType().ToString() + ":" + ex.Message);
                return -1;
            }
#if DEBUG
            finally
            {
                Console.ReadLine();
            }
#endif
        }
    }
}
